// Package hash 对接PHP中使用CRC64算法，把字符串转变为bigint
// User: 青锋真人<zengwanzhong@movee.cn>
// Datetime: 2020/3/3 10:50
package hash

type PHPCRC64 struct {
	table [256]int64
}

func (p *PHPCRC64) Hash(s string) uint64 {
	var crc int64
	byteS := []byte(s)
	for _, v := range byteS {
		crc = p.table[(crc^int64(rune(v)))&0xff] ^ ((crc >> 8) & 72057594037927935)
	}
	return uint64(crc)
}

var phpCRC64Table = [256]int64{0, -5535402513002963089, -827476681416466341, 5164075066763771700, 8921845837811637811,
	-3963573138538102436, -8118593940182008216, 4357999468653093127, -603052398086275994, 4940391307328217865,
	226782375002905661, -5761232158350294190, -8326798863640698283, 4566377562367245626, 8715998937306186254,
	-3757340862016250527, 9051005139383707209, -3551671569944921818, -8565961459053115886, 4193374422961527165,
	453564750005811322, -5375839991167752427, -950447627940620255, 4747102235666401102, -8486428553008784849,
	4113029525020509504, 9132755124734491252, -3634302816408165093, -1014746199097179108, 4811156168024382323,
	391483189436228679, -5314072338612520152, -344733794942137198, 5195199925788447741, 1131375642422963401,
	-4855662593294912602, -9158208430687022431, 3731739485546663374, 8386748845923054330, -4085333180854407787,
	907129500011622644, -4631800727367372901, -571126819714445137, 5421418680781082560, 8594564625313771207,
	-4294100590368099928, -8952539602376749412, 3525329033817543155, -8742362874173347109, 3855837706121835956,
	8226059050041019008, -4537770656272329233, -181233824240569112, 5643692520190618503, 718348998302913715,
	-4983696819872789540, 8146277531524994749, -4457674130217743918, -8824431737660786970, 3938150108875254153,
	782966378872457358, -5047431839805663263, -118903857361917739, 5582173445676054458, 7257036000092981153,
	-2911463407282235186, -8056344222132656134, 2529986302517213333, 2262751284845926802, -6032390349762361603,
	-1449351927949395511, 6398650419759490726, -7847613871801156665, 2322133910755632296, 7463478971093326748,
	-3117099887985244941, -1673246381863442956, 6622864283287239323, 2036569382881248687, -5805960506456565056,
	1814259000023245288, -6195890629502321017, -1321317598487363149, 6811676960462675676, 7132938157145702363,
	-3327309341956448076, -7603906712147386496, 2690676064372932847, -1257614823082009202, 6747026957542163169,
	1875814858707893717, -6258183708997999942, -7684039816217820227, 2770420489343360210, 7050658067635086310,
	-3245207924841710455, -6953160100862932173, 3219832958944941148, 7711675412243671912, -2870179086519323641,
	-1994625973627513600, 6305011443818121839, 1213047649942025563, -6630476404036343244, 7503259434831574869,
	-2662012149972555718, -7159359033328314610, 3425713581329221729, 1436697996605827430, -6854934340521691639,
	-1768758650736473795, 6078267261889762898, -2154189010659562118, 5851447209550246421, 1630020308903038241,
	-6507505285908540850, -7365062116336110775, 3090674103720225830, 7876300217750508306, -2422811326922453891,
	1565932757744914716, -6443240161887138189, -2215918504504708793, 5913566482019610152, 7956607163135676207,
	-2502382151029190592, -7282397182357442700, 3008957496780927003, -3932672073523589310, 8809633696146542637,
	4460922918905818905, -8158783662249152394, -5567412237929787023, 113391187501452830, 5059972605034426666,
	-786178333796749755, 4525502569691853604, -8222556824080028597, -3870308643033771137, 8748148222884465680,
	4980157760350383383, -706115546429410696, -5649443234190570164, 195741594718114339, -5406581602485245685,
	565687821211481700, 4644267821511264592, -910417325212854721, -3519786131522898120, 8937808626997553239,
	4297282312656885603, -8607135623245150196, 4852190599768102253, -1119077323475416574, -5201015507135072970,
	359174499151456857, 4073138765762497374, -8383170749551946703, -3746286292604474619, 9163920108173816938,
	3628518000046490576, -9118283621180465985, -4116532283263851637, 8498696072880078052, 5299565100954197475,
	-385731908190223732, -4823390152784200264, 1018284691440624343, -4180867759418146890, 8562713237611094233,
	3566469078572851181, -9056483741914333054, -4743889748392664699, 937907429353946858, 5381352128745865694,
	-468326524461261135, 5746791986423309721, -220966226947081482, -4952690158625225278, 606523824971012781,
	3751629717415787434, -8701451563069430587, -4569956191557559311, 8338992711486538910, -5160786708676208129,
	815010154451519120, 5540840978686720420, -14837645541906741, -4345427938439378996, 8115412784602421411,
	3978303581567838103, -8927389306748356360, -5919282011750233885, 2230461459452909452, 6439665917889882296,
	-1553734490144933929, -3023393249222207792, 7288217715337890239, 2490078880175191691, -7953140121649534492,
	6520081235612152965, -1633197079553807382, -5836721186073307938, 2148641156328442801, 2426095299884051126,
	-7888771163999816231, -3085231252839216403, 7350228890552538498, -3440225204046401878, 7165105895222849989,
	2649782550477098737, -7499716522796904034, -6084047658828648295, 1783234539286425590, 6851427162658443458,
	-1424434862061826131, 2873395993211654860, -7724211225838613085, -3214325240990928233, 6938393941075996152,
	6642978682516671743, -1216300290739711088, -6290209549930025820, 1989151790783919051, 6263731030979658865,
	-1890541448826905826, -6743849654609058774, 1245039440087595845, 3260040617806076482, -7056101485762165459,
	-2757949010207720935, 7680756410435167606, -6823875760881862633, 1324891275238549368, 6181348207440451660,
	-1808542903113677021, -2694143638208535004, 7616209416359311691, 3321489341258335871, -7118501837995222768,
	3131865515489829432, -7468987255756522153, -2309597564811247005, 7844397531750915340, 5811434156413844491,
	-2051371843948305564, -6619611109670331312, 1660744670629167935, -2533529747438199202, 8068573254449152305,
	2905717078206922245, -7242523810129747606, -6410914086585843603, 1452858539103461122, 6017914993561854006,
	-2256970321264951463,
}

func NewPHPCRC64() *PHPCRC64 {
	p := PHPCRC64{}
	p.table = phpCRC64Table
	return &p
}
